Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / app / src / google / java / com / geeksville / mesh / ui / map / MapViewModel.kt

Displaying Raw • Download

app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt ui_message_list (be3f882f) Text, 21.19 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787com.geeksville.mesh.ui.map

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.core.net.toFile
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787com.geeksville.mesh.ConfigProtos
Tff7b72import T7ee787com.geeksville.mesh.android.BuildUtils.debug
Tff7b72import T7ee787com.geeksville.mesh.android.prefs.GoogleMapsPrefs
Tff7b72import T7ee787com.geeksville.mesh.android.prefs.MapPrefs
Tff7b72import T7ee787com.geeksville.mesh.database.NodeRepository
Tff7b72import T7ee787com.geeksville.mesh.database.PacketRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.datastore.RadioConfigRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.map.CustomTileProviderRepository
Tff7b72import T7ee787com.google.android.gms.maps.GoogleMap
Tff7b72import T7ee787com.google.android.gms.maps.model.TileProvider
Tff7b72import T7ee787com.google.android.gms.maps.model.UrlTileProvider
Tff7b72import T7ee787com.google.maps.android.compose.MapType
Tff7b72import T7ee787com.google.maps.android.data.geojson.GeoJsonLayer
Tff7b72import T7ee787com.google.maps.android.data.kml.KmlLayer
Tff7b72import T7ee787dagger.hilt.android.lifecycle.HiltViewModel
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.flow.mapNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.stateIn
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787kotlinx.serialization.Serializable
Tff7b72import T7ee787org.json.JSONObject
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787java.io.FileOutputStream
Tff7b72import T7ee787java.io.IOException
Tff7b72import T7ee787java.io.InputStream
Tff7b72import T7ee787java.net.MalformedURLException
Tff7b72import T7ee787java.net.URL
Tff7b72import T7ee787java.util.UUID
Tff7b72import T7ee787javax.inject.Inject

Tff7b72private Tff7b72const Tff7b72val Te6edf3TILE_SIZE Tff7b72= T79c0ff2T79c0ff5T79c0ff6

Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364MapCameraPositionTb4b4b4(
Tff7b72val Te6edf3targetLatTb4b4b4: Tffa657DoubleTb4b4b4,
Tff7b72val Te6edf3targetLngTb4b4b4: Tffa657DoubleTb4b4b4,
Tff7b72val Te6edf3zoomTb4b4b4: Tffa657FloatTb4b4b4,
Tff7b72val Te6edf3tiltTb4b4b4: Tffa657FloatTb4b4b4,
Tff7b72val Te6edf3bearingTb4b4b4: Tffa657FloatTb4b4b4,
Tb4b4b4)

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@HiltViewModel
Tff7b72class T56d364MapViewModel
Tf0883e@Inject
Tff7b72constructorTb4b4b4(
Tff7b72private Tff7b72val Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4,
Te6edf3mapPrefsTb4b4b4: Te6edf3MapPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3googleMapsPrefsTb4b4b4: Te6edf3GoogleMapsPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3customTileProviderRepositoryTb4b4b4: Te6edf3CustomTileProviderRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3BaseMapViewModelTb4b4b4(Te6edf3mapPrefsTb4b4b4, Te6edf3nodeRepositoryTb4b4b4, Te6edf3packetRepositoryTb4b4b4) Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3_errorFlow Tff7b72= Te6edf3MutableSharedFlowTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3errorFlowTb4b4b4: Te6edf3SharedFlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_errorFlowTb4b4b4.Te6edf3asSharedFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3customTileProviderConfigsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tff7b72> Tff7b72=
Te6edf3customTileProviderRepository
Tb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4, Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedCustomTileProviderUrl Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3selectedCustomTileProviderUrlTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedGoogleMapType Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4)
Tff7b72val Te6edf3selectedGoogleMapTypeTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTypeTff7b72> Tff7b72= Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3displayUnits Tff7b72=
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3deviceProfileFlow
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3configTb4b4b4.Te6edf3displayTb4b4b4.Te6edf3units Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3ConfigProtosTb4b4b4.Te6edf3ConfigTb4b4b4.Te6edf3DisplayConfigTb4b4b4.Te6edf3DisplayUnitsTb4b4b4.Te6edf3METRICTb4b4b4,
Tb4b4b4)

Tff7b72fun Td2a8ffaddCustomTileProviderTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name or URL template for custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider with name 'Tffd700$Te6edf3nameTa5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72val Te6edf3newConfig Tff7b72= Te6edf3CustomTileProviderConfigTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3urlTemplate Tff7b72= Te6edf3urlTemplateTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3addCustomTileProviderTb4b4b4(Te6edf3newConfigTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffupdateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4: Te6edf3CustomTileProviderConfigTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name or URL template for updating custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72val Te6edf3existingConfigs Tff7b72= Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(
Te6edf3existingConfigsTb4b4b4.Te6edf3any Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3id Tff7b72!Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3id Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffAnother custom tile provider with name 'Tffd700${Te6edf3configToUpdateTb4b4b4.Te6edf3nameTffd700}Ta5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3updateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4)

Tff7b72val Te6edf3originalConfig Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4)
Tff7b72if Tb4b4b4(
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Te6edf3originalConfigTff7b72?.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value
Tb4b4b4) Tb4b4b4{
T8b949e// No change needed if URL didn't change, or handle if it did
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3originalConfig Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3originalConfigTb4b4b4.Te6edf3urlTemplateTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3currentlySelectedConfig Tff7b72=
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3currentlySelectedConfigTff7b72?.Te6edf3id Tff7b72=Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplate
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3configToRemove Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configIdTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3deleteCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3configToRemove Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configToRemoveTb4b4b4.Te6edf3urlTemplateTb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
T8b949e// Also clear from prefs
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffselectCustomTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Ta5d6ff"Ta5d6ffAttempted to select invalid URL template: Tffd700${Te6edf3configTb4b4b4.Te6edf3urlTemplateTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Tff7b72null
Tff7b72return
Tb4b4b4}
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3configTb4b4b4.Te6edf3urlTemplate
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL T8b949e// Reset to a default or keep last? For now, reset.
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Te6edf3configTb4b4b4.Te6edf3urlTemplate
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapType Tff7b72= Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsetSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4: Te6edf3MapTypeTb4b4b4) Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3mapType
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null T8b949e// Clear custom selection
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapType Tff7b72= Te6edf3mapTypeTb4b4b4.Te6edf3name
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72fun Td2a8ffcreateUrlTileProviderTb4b4b4(Te6edf3urlStringTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3TileProvider? Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlStringTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffTile URL does not contain valid {x}, {y}, and {z} placeholders: Tffd700$Te6edf3urlStringTa5d6ff"Tb4b4b4)
Tff7b72return Tff7b72null
Tb4b4b4}
Tff7b72return Tff7b72object Tb4b4b4: T56d364UrlTileProviderTb4b4b4(Te6edf3TILE_SIZETb4b4b4, Te6edf3TILE_SIZETb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetTileUrlTb4b4b4(Te6edf3xTb4b4b4: Tffa657IntTb4b4b4, Te6edf3yTb4b4b4: Tffa657IntTb4b4b4, Te6edf3zoomTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3URL? Tb4b4b4{
Tff7b72val Te6edf3formattedUrl Tff7b72=
Te6edf3urlString
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3zoomTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3xTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3yTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72return Tff7b72try Tb4b4b4{
Te6edf3URLTb4b4b4(Te6edf3formattedUrlTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3MalformedURLExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffMalformed URL: Tffd700$Te6edf3formattedUrlTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffisValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)

Tff7b72private Tff7b72val Te6edf3_mapLayers Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3mapLayersTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72> Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72init Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Te6edf3loadPersistedMapTypeTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3loadPersistedLayersTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffloadPersistedMapTypeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3savedCustomUrl Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl
Tff7b72if Tb4b4b4(Te6edf3savedCustomUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
T8b949e// Check if this custom provider still exists
Tff7b72if Tb4b4b4(
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3savedCustomUrl Tb4b4b4} Tff7b72&Tff7b72&
Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3savedCustomUrlTb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3savedCustomUrl
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL T8b949e// Default, as custom is active
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// The saved custom URL is no longer valid or doesn't exist, remove preference
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrl Tff7b72= Tff7b72null
T8b949e// Fallback to default Google Map type
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3savedGoogleMapTypeName Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapType
Tff7b72try Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3valueOfTb4b4b4(Te6edf3savedGoogleMapTypeName Tff7b72?: Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffInvalid saved Google Map type: Tffd700$Te6edf3savedGoogleMapTypeNameTa5d6ff"Tb4b4b4)
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL T8b949e// Fallback in case of invalid stored name
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapType Tff7b72= Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffloadPersistedLayersTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3layersDir Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3layersDirTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3layersDirTb4b4b4.Te6edf3isDirectoryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3persistedLayerFiles Tff7b72= Te6edf3layersDirTb4b4b4.Te6edf3listFilesTb4b4b4(Tb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3persistedLayerFiles Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3hiddenLayerUrls Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrls
Tff7b72val Te6edf3loadedItems Tff7b72=
Te6edf3persistedLayerFilesTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3file Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3isFileTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3layerType Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3extensionTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffkmlTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffkmzTa5d6ff"Tb4b4b4,
Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3KML
Ta5d6ff"Ta5d6ffgeojsonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4,
Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}

Te6edf3layerTypeTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3fileTb4b4b4)
Te6edf3MapLayerItemTb4b4b4(
Te6edf3name Tff7b72= Te6edf3fileTb4b4b4.Te6edf3nameWithoutExtensionTb4b4b4,
Te6edf3uri Tff7b72= Te6edf3uriTb4b4b4,
Te6edf3isVisible Tff7b72= Tff7b72!Te6edf3hiddenLayerUrlsTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3layerType Tff7b72= Tffa657itTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3loadedItems
Tff7b72if Tb4b4b4(Te6edf3loadedItemsTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Tffd700${Te6edf3loadedItemsTb4b4b4.Te6edf3sizeTffd700}Ta5d6ff persisted map layers.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3iTb4b4b4(Ta5d6ff"Ta5d6ffMap layers directory does not exist. No layers loaded.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffError loading persisted map layersTa5d6ff"Tb4b4b4)
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddMapLayerTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657String?Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3layerName Tff7b72= Te6edf3fileNameTff7b72?.Te6edf3substringBeforeLastTb4b4b4(Ta5d6ff'.'Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ffLayer Tffd700${Te6edf3mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3size Tff7b72+ T79c0ff1Tffd700}Ta5d6ff"

Tff7b72val Te6edf3extension Tff7b72=
Te6edf3fileNameTff7b72?.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'.'Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72?.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72?: Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3getTypeTb4b4b4(Te6edf3uriTb4b4b4)Tff7b72?.Te6edf3splitTb4b4b4(Ta5d6ff'/'Tb4b4b4)Tff7b72?.Te6edf3lastTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3kmlExtensions Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffkmlTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffkmzTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvnd.google-earth.kml+xmlTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvnd.google-earth.kmzTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3geoJsonExtensions Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffgeojsonTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3layerType Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3extensionTb4b4b4) Tb4b4b4{
Tff7b72in Te6edf3kmlExtensions Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3KML
Tff7b72in Te6edf3geoJsonExtensions Tff7b72-Tff7b72> Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3layerType Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported map layer file type: Tffd700$Te6edf3extensionTa5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72val Te6edf3finalFileName Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3fileName Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Ta5d6ff"Tffd700$Te6edf3layerNameTa5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6fflayer_Tffd700${Te6edf3UUIDTb4b4b4.Te6edf3randomUUIDTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tb4b4b4}

Tff7b72val Te6edf3localFileUri Tff7b72= Te6edf3copyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3finalFileNameTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3localFileUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3newItem Tff7b72= Te6edf3MapLayerItemTb4b4b4(Te6edf3name Tff7b72= Te6edf3layerNameTb4b4b4, Te6edf3uri Tff7b72= Te6edf3localFileUriTb4b4b4, Te6edf3layerType Tff7b72= Te6edf3layerTypeTb4b4b4)
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72+ Te6edf3newItem
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffFailed to copy file to internal storage.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffcopyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Uri? Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3inputStream Tff7b72= Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriTb4b4b4)
Tff7b72val Te6edf3directory Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3directoryTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3directoryTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3outputFile Tff7b72= Te6edf3FileTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3fileNameTb4b4b4)
Tff7b72val Te6edf3outputStream Tff7b72= Te6edf3FileOutputStreamTb4b4b4(Te6edf3outputFileTb4b4b4)

Te6edf3inputStreamTff7b72?.Te6edf3use Tb4b4b4{ Te6edf3input Tff7b72-Tff7b72> Te6edf3outputStreamTb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3output Tff7b72-Tff7b72> Te6edf3inputTb4b4b4.Te6edf3copyToTb4b4b4(Te6edf3outputTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3outputFileTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffError copying file to internal storageTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8fftoggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3toggledLayerTb4b4b4: Te6edf3MapLayerItem? Tff7b72= Tff7b72null
Tff7b72val Te6edf3updatedLayers Tff7b72=
Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3map Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerIdTb4b4b4) Tb4b4b4{
Te6edf3toggledLayer Tff7b72= Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3isVisible Tff7b72= Tff7b72!Tffa657itTb4b4b4.Te6edf3isVisibleTb4b4b4)
Te6edf3toggledLayer
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657it
Tb4b4b4}
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3updatedLayers

Te6edf3toggledLayerTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3isVisibleTb4b4b4) Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrls Tff7b72-Tff7b72= Tffa657itTb4b4b4.Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrls Tff7b72+Tff7b72= Tffa657itTb4b4b4.Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3layerToRemove Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerId Tb4b4b4}
Tff7b72when Tb4b4b4(Te6edf3layerToRemoveTff7b72?.Te6edf3layerTypeTb4b4b4) Tb4b4b4{
Te6edf3LayerTypeTb4b4b4.Te6edf3KML Tff7b72-Tff7b72> Te6edf3layerToRemoveTb4b4b4.Te6edf3kmlLayerDataTff7b72?.Te6edf3removeLayerFromMapTb4b4b4(Tb4b4b4)
Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON Tff7b72-Tff7b72> Te6edf3layerToRemoveTb4b4b4.Te6edf3geoJsonLayerDataTff7b72?.Te6edf3removeLayerFromMapTb4b4b4(Tb4b4b4)
Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Te6edf3layerToRemoveTff7b72?.Te6edf3uriTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3uri Tff7b72-Tff7b72>
Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3hiddenLayerUrls Tff7b72-Tff7b72= Te6edf3uriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3value Tff7b72= Te6edf3_mapLayersTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3filterNot Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerId Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3file Tff7b72= Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fileTb4b4b4.Te6edf3deleteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffError deleting file from internal storageTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffRecycleTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffgetInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4)Tb4b4b4: Te6edf3InputStream? Tb4b4b4{
Tff7b72val Te6edf3uriToLoad Tff7b72= Te6edf3layerItemTb4b4b4.Te6edf3uri Tff7b72?: Tff7b72return Tff7b72null
Tff7b72return Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriToLoadTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3debugTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModel: Error opening InputStream from URI: Tffd700$Te6edf3uriToLoadTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72suspend Tff7b72fun Td2a8ffloadMapLayerIfNeededTb4b4b4(Te6edf3mapTb4b4b4: Te6edf3GoogleMapTb4b4b4, Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3layerItemTb4b4b4.Te6edf3kmlLayerData Tff7b72!Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3layerItemTb4b4b4.Te6edf3geoJsonLayerData Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return
Tff7b72try Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3layerItemTb4b4b4.Te6edf3layerTypeTb4b4b4) Tb4b4b4{
Te6edf3LayerTypeTb4b4b4.Te6edf3KML Tff7b72-Tff7b72> Te6edf3loadKmlLayerIfNeededTb4b4b4(Te6edf3layerItemTb4b4b4, Te6edf3mapTb4b4b4)

Te6edf3LayerTypeTb4b4b4.Te6edf3GEOJSON Tff7b72-Tff7b72> Te6edf3loadGeoJsonLayerIfNeededTb4b4b4(Te6edf3layerItemTb4b4b4, Te6edf3mapTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3tagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4, Ta5d6ff"Ta5d6ffError loading map layer for Tffd700${Te6edf3layerItemTb4b4b4.Te6edf3uriTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffloadKmlLayerIfNeededTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4, Te6edf3mapTb4b4b4: Te6edf3GoogleMapTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3kmlLayer Tff7b72=
Te6edf3getInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4)Tff7b72?.Te6edf3use Tb4b4b4{
Te6edf3KmlLayerTb4b4b4(Te6edf3mapTb4b4b4, Tffa657itTb4b4b4, Te6edf3applicationTb4b4b4.Te6edf3applicationContextTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3layerItemTb4b4b4.Te6edf3isVisibleTb4b4b4) Te6edf3removeLayerFromMapTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3currentLayers Tff7b72-Tff7b72>
Te6edf3currentLayersTb4b4b4.Te6edf3map Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerItemTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3kmlLayerData Tff7b72= Te6edf3kmlLayerTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657it
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffloadGeoJsonLayerIfNeededTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4, Te6edf3mapTb4b4b4: Te6edf3GoogleMapTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3geoJsonLayer Tff7b72=
Te6edf3getInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4)Tff7b72?.Te6edf3use Tb4b4b4{ Te6edf3inputStream Tff7b72-Tff7b72>
Tff7b72val Te6edf3jsonObject Tff7b72= Te6edf3JSONObjectTb4b4b4(Te6edf3inputStreamTb4b4b4.Te6edf3bufferedReaderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3readTextTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Te6edf3GeoJsonLayerTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3jsonObjectTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Tff7b72if Tb4b4b4(Tff7b72!Te6edf3layerItemTb4b4b4.Te6edf3isVisibleTb4b4b4) Te6edf3removeLayerFromMapTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3_mapLayersTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3currentLayers Tff7b72-Tff7b72>
Te6edf3currentLayersTb4b4b4.Te6edf3map Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3layerItemTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3geoJsonLayerData Tff7b72= Te6edf3geoJsonLayerTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657it
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffclearLoadedLayerDataTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_mapLayersTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3currentLayers Tff7b72-Tff7b72>
Te6edf3currentLayersTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3kmlLayerData Tff7b72= Tff7b72nullTb4b4b4, Te6edf3geoJsonLayerData Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72enum Tff7b72class T56d364LayerType Tb4b4b4{
Te6edf3KMLTb4b4b4,
Te6edf3GEOJSONTb4b4b4,
Tb4b4b4}

Tff7b72data Tff7b72class T56d364MapLayerItemTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657String Tff7b72= Te6edf3UUIDTb4b4b4.Te6edf3randomUUIDTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3uriTb4b4b4: Te6edf3Uri? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72var Te6edf3isVisibleTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Tff7b72var Te6edf3kmlLayerDataTb4b4b4: Te6edf3KmlLayer? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72var Te6edf3geoJsonLayerDataTb4b4b4: Te6edf3GeoJsonLayer? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3layerTypeTb4b4b4: Te6edf3LayerTypeTb4b4b4,
Tb4b4b4)

Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364CustomTileProviderConfigTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657String Tff7b72= Te6edf3UUIDTb4b4b4.Te6edf3randomUUIDTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.2 - Generated in 0.18s